/*
 * Created on 11/02/2005
 */
package gov.pr.celepar.sentinela.client;

import gov.pr.celepar.sentinela.Constants;
import gov.pr.celepar.sentinela.client.pojo.Funcao;
import gov.pr.celepar.sentinela.comunicacao.SentinelaParam;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * @author root
 */
public class ArvoreFuncoesMenu implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 4590556570162332919L;

	private List<ItemMenu> filhos = new ArrayList<ItemMenu>();

	public void incluir(Funcao funcao) {

		if (funcao != null) {
			ItemMenu aux = new ItemMenu(funcao);

			if (aux.getCodFuncaoPai() > 0) {
				for (int i = 0; i < this.filhos.size(); i++) {
					ItemMenu item = (ItemMenu) this.filhos.get(i);
					if (item.incluir(aux))
						break;
				}
			} else {
				this.filhos.add(aux);
			}

		}
	}

	public String toString() {
		StringBuffer sb = new StringBuffer("\n");
		Iterator itr = this.filhos.iterator();
		while (itr.hasNext()) {
			ItemMenu aux = (ItemMenu) itr.next();
			sb.append(aux.toString());
		}
		return sb.toString();
	}

	public List doWrapper() {
		List<SentinelaParam> params = null;
		if (this.filhos != null && !this.filhos.isEmpty()) {
			params = new ArrayList<SentinelaParam>();
			Iterator i = this.filhos.iterator();
			while (i.hasNext()) {
				ItemMenu aux = (ItemMenu) i.next();

				aux.doWrapper(params);
			}

		}
		return params;
	}

	public ArvoreFuncoesMenu() {
		super();
	}

	public List getFilhos() {
		return this.filhos;
	}

	public void setFilhos(List<ItemMenu> filhos) {
		this.filhos = filhos;
	}

	public class ItemMenu implements Serializable {

		/**
		 * 
		 */
		private static final long serialVersionUID = 8661132314203527114L;

		private List<ItemMenu> filhosItem;

		private long codFuncao;

		private long codFuncaoPai;

		private String nome;

		private String url;

		// private String descricao;

		private int ordemMenu;

		private ItemMenu() {
			super();
			this.filhosItem = new ArrayList<ItemMenu>();
		}

		public void doWrapper(List<SentinelaParam> params) {

			String param[] = new String[2];
			param[0] = this.url;
			param[1] = Long.toString(this.codFuncaoPai);
			SentinelaParam pr = new SentinelaParam((int) this.codFuncao,
					this.nome, param);
			params.add(pr);

			if (this.filhosItem != null && !this.filhosItem.isEmpty()) {
				Iterator i = this.filhosItem.iterator();
				while (i.hasNext()) {
					ItemMenu aux = (ItemMenu) i.next();

					aux.doWrapper(params);
				}
			}
		}

		ItemMenu(Funcao funcao) {
			super();
			this.filhosItem = new ArrayList<ItemMenu>();
			this.codFuncao = funcao.getCodFuncao();
			if (funcao.getFuncaoPai() != null) {
				this.codFuncaoPai = funcao.getFuncaoPai().getCodFuncao();
			} else {
				this.codFuncaoPai = 0;
			}
			this.nome = funcao.getNome();
			this.url = funcao.getUrl();
			this.ordemMenu = funcao.getOrdemMenu();
		}

		public boolean incluir(ItemMenu item) {

			if (item != null) {
				if (item.codFuncaoPai == this.codFuncao) {
					this.filhosItem.add(item);
					return true;
				}
				ItemMenu aux = consultar(item.getCodFuncaoPai());
				if (aux != null) {
					aux.incluir(item);
				}
			}
			return false;
		}

		public ItemMenu consultar(long key) {
			ItemMenu aux = null;
			if (this.codFuncao == key)
				return this;
			for (int i = 0; i < this.filhosItem.size(); i++) {
				aux = (ItemMenu) this.filhosItem.get(i);
				if (aux.getCodFuncao() == key) {
					return aux;
				}
				aux = aux.consultar(key);
				if (aux != null)
					return aux;
			}
			return null;
		}

		public long getCodFuncao() {
			return this.codFuncao;
		}

		public void setCodFuncao(long codFuncao) {
			this.codFuncao = codFuncao;
		}

		public long getCodFuncaoPai() {
			return this.codFuncaoPai;
		}

		public void setCodFuncaoPai(long codFuncaoPai) {
			this.codFuncaoPai = codFuncaoPai;
		}

		/*
		 * public String getDescricao() { return this.descricao; }
		 * 
		 * public void setDescricao(String descricao) { this.descricao =
		 * descricao; }
		 */

		public String getNome() {
			return this.nome;
		}

		public void setNome(String nome) {
			this.nome = nome;
		}

		public int getOrdemMenu() {
			return this.ordemMenu;
		}

		public void setOrdemMenu(int ordemMenu) {
			this.ordemMenu = ordemMenu;
		}

		public String getUrl() {
			return this.url;
		}

		public void setUrl(String url) {
			this.url = url;
		}

		public String toString() {

			StringBuffer s = new StringBuffer();

			s.append(this.getNome()).append("\n");

			for (int i = 0; i < this.filhosItem.size(); i++) {
				ItemMenu item = (ItemMenu) this.filhosItem.get(i);
				s.append(item);
			}

			return s.toString();
		}

		public List<ItemMenu> getFilhos() {
			return this.filhosItem;
		}

		public void setFilhos(List<ItemMenu> filhos) {
			this.filhosItem = filhos;
		}
	}

	public String getPathFuncao(long codFuncao) {
		if (this.filhos != null && !this.filhos.isEmpty()) {
			Iterator i = this.filhos.iterator();
			while (i.hasNext()) {
				ItemMenu item = (ItemMenu) i.next();

				ItemMenu aux = item.consultar(codFuncao);

				if (aux != null) {
					if (aux.getCodFuncaoPai() > 0) {
						return (getPathFuncao(aux.getCodFuncaoPai())
								+ Constants.PATH_SEPARATOR + aux.getNome());
					}
					return aux.getNome();
				}
			}
		}
		return "";
	}
}
